package Formularios;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.List;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import org.eclipse.wb.swing.FocusTraversalOnArray;
import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFormattedTextField;
import javax.swing.JPasswordField;

public class frmEmpleados extends JFrame {

	private JPanel contentPane;
	
	// teclas Virtuales
	static final int VK_SALTO_DE_LINEA = 10;
	static final int VK_F5 = 116;
	static final int VK_SUPR = 127;
	
	//PERMISOS
	static final int TOTAL_PERMISOS = 8; //numero total de permisos
	static final int ALTA_CLIENTES	= 0; //ALTA DE CLIENTES
	static final int ALTA_PRODUCTOS	= 1; //ALTA DE PRODUCTOS
	static final int ALTA_REACTIVOS	= 2; //ALTA DE REACTIVOS
	static final int ALTA_EMPLEADOS	= 3; //ALTA DE EMPLEADOS
	static final int ENTRADA_PROD	= 4; //ENTRADA DE PRODUCTOS
	static final int ENTRADA_REAC	= 5; //ENTRADA DE REACTIVOS
	static final int SALIDA_REAC	= 6; //ENTRADA DE REACTIVOS
	static final int VENTAS			= 7; //ENTRADA DE REACTIVOS
	
	static Statement comando;
	static Connection con;
	private JTextField txtNumEmpleado;
	private JTextField txtNombre;
	private JTextField txtApellidoM;
	private JTextField txtApellidoP;
	private JScrollPane scrollPane;
	private JScrollPane scrollPane_1;
	DefaultListModel ListModel1;
	DefaultListModel ListModel2;
	private JPasswordField txtClave;
	StatusBar sbMensaje;
	JList lbPermisos;
	JButton btnAsignar;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frmEmpleados frame = new frmEmpleados();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public frmEmpleados() {
		setTitle("Registro de Empleados");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 450, 551);
		
		// Centrar
		setLocationRelativeTo(null);
		
		general gen = new general();
		try {
			comando = gen.abrirConexion(cNemonicos.IP_GLOBAL,1);
		} catch (ClassNotFoundException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (SQLException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNunEmpleado = new JLabel("Num. Empleado :");
		lblNunEmpleado.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNunEmpleado.setBounds(12, 23, 125, 15);
		contentPane.add(lblNunEmpleado);
		
		txtNumEmpleado = new JTextField();
		txtNumEmpleado.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA  )
				{
					if ( txtNumEmpleado.getText().length() == 0)
					{
						int iNumEmpleado = general.consultarFolio(comando, cNemonicos.FOLIO_EMPLEADOS, cNemonicos.SIGUIENTE_SECUENCIA);
						txtNumEmpleado.setText(String.valueOf(iNumEmpleado));
						limpiar();
						txtClave.requestFocus();
					}
					else
					{
						if ( !conslutar(Integer.parseInt(txtNumEmpleado.getText())))
						{
							limpiar();
						}
					}
				}
				else
				{

				}
				
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if ((!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtNumEmpleado.getText().length() == 4) {
					e.consume();
				}
			}
		});
		txtNumEmpleado.setBounds(155, 21, 70, 19);
		contentPane.add(txtNumEmpleado);
		txtNumEmpleado.setColumns(10);
		
		JLabel lblNombre = new JLabel("Nombre :");
		lblNombre.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNombre.setBounds(67, 50, 70, 15);
		contentPane.add(lblNombre);
		
		txtNombre = new JTextField();
		txtNombre.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == cNemonicos.VK_SALTO_DE_LINEA)
				{
					txtApellidoP.requestFocus();
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if (((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtNombre.getText().length() == 25) {
					e.consume();
				}
			}
		});
		txtNombre.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtNombre.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar un Nombre","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtNombre.requestFocus();
					return false;
				}
				
			}
		});
		txtNombre.setBounds(155, 48, 114, 19);
		contentPane.add(txtNombre);
		txtNombre.setColumns(10);
		
		JLabel lblApellidoMat = new JLabel("Apellido Mat. :");
		lblApellidoMat.setHorizontalAlignment(SwingConstants.RIGHT);
		lblApellidoMat.setBounds(22, 106, 115, 15);
		contentPane.add(lblApellidoMat);
		
		txtApellidoM = new JTextField();
		txtApellidoM.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == cNemonicos.VK_SALTO_DE_LINEA)
				{
					lbPermisos.setSelectedIndex(0);
					btnAsignar.requestFocus();
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if (((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtApellidoM.getText().length() == 20) {
					e.consume();
				}
			}
		});
		txtApellidoM.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtApellidoM.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar un apellido materno","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtApellidoM.requestFocus();
					return false;
				}
				
			}
		});
		txtApellidoM.setBounds(155, 104, 114, 19);
		contentPane.add(txtApellidoM);
		txtApellidoM.setColumns(10);
		
		JLabel lblApellidoPat = new JLabel("Apellido Pat. :");
		lblApellidoPat.setHorizontalAlignment(SwingConstants.RIGHT);
		lblApellidoPat.setBounds(22, 77, 115, 15);
		contentPane.add(lblApellidoPat);
		
		txtApellidoP = new JTextField();
		txtApellidoP.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == cNemonicos.VK_SALTO_DE_LINEA)
				{
					txtApellidoM.requestFocus();
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if (((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtApellidoP.getText().length() == 20) {
					e.consume();
				}
			}
		});
		txtApellidoP.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtApellidoP.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar un apellido paterno","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtApellidoP.requestFocus();
					return false;
				}
				
			}
		});
		txtApellidoP.setBounds(155, 75, 114, 19);
		contentPane.add(txtApellidoP);
		txtApellidoP.setColumns(10);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 150, 174, 339);
		contentPane.add(scrollPane);
		
		ListModel1 = new DefaultListModel();
		llenarLista();
		
		
		lbPermisos = new JList(ListModel1);
		
		lbPermisos.setVisibleRowCount(15);
		scrollPane.setViewportView(lbPermisos);
		
		scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(262, 150, 174, 339);
		contentPane.add(scrollPane_1);
		
		ListModel2 = new DefaultListModel();
		final JList lbPermisosUsuario = new JList(ListModel2);
		scrollPane_1.setViewportView(lbPermisosUsuario);
	
		
		btnAsignar = new JButton(">");
		btnAsignar.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == cNemonicos.VK_F5)
				{
					guardar();
					limpiar();
					txtNumEmpleado.setText("");
					txtNumEmpleado.requestFocus();
				}
			}
		});
		btnAsignar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				sbMensaje.setText("[ F5 ] Guardar");
				ListModel2.addElement(lbPermisos.getModel().getElementAt(lbPermisos.getSelectedIndex()));
				ListModel1.removeElementAt(lbPermisos.getSelectedIndex());
				lbPermisos.setSelectedIndex(0);
			}
		});
		
		btnAsignar.setBounds(198, 175, 52, 25);
		contentPane.add(btnAsignar);
		
		JButton btnQuitar = new JButton("<");
		btnQuitar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				//sbMensaje.setText("[ F5 ] Guardar");
				ListModel1.addElement(lbPermisosUsuario.getModel().getElementAt(lbPermisosUsuario.getSelectedIndex()));
				ListModel2.removeElementAt(lbPermisosUsuario.getSelectedIndex());
				//guardar();
			}
		});
		btnQuitar.setBounds(198, 217, 52, 25);
		contentPane.add(btnQuitar);
		
		JLabel lblContrasea = new JLabel("Clave :");
		lblContrasea.setBounds(243, 21, 92, 15);
		contentPane.add(lblContrasea);
		
		txtClave = new JPasswordField();
		txtClave.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtClave.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar una clave","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtClave.requestFocus();
					return false;
				}
				
			}
		});
		txtClave.setBounds(302, 21, 92, 19);
		contentPane.add(txtClave);
		txtClave.setColumns(10);
		
		sbMensaje = new StatusBar();
		sbMensaje.setHorizontalAlignment(SwingConstants.CENTER);
		sbMensaje.setBounds(12, 502, 424, 16);
		contentPane.add(sbMensaje);
		setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{txtNumEmpleado, txtClave, txtNombre, txtApellidoP, txtApellidoM, btnAsignar, btnQuitar}));
	}
	
	public void llenarLista() {
		ListModel1.addElement("ALTA_CLIENTES");
		ListModel1.addElement("ALTA_PRODUCTOS");
		ListModel1.addElement("ALTA_REACTIVOS");
		ListModel1.addElement("ALTA_EMPLEADOS");
		ListModel1.addElement("ENTRADA_PROD");
		ListModel1.addElement("ENTRADA_REAC");
		ListModel1.addElement("SALIDA_REAC");
		ListModel1.addElement("VENTAS");

	}
	public String formarPermisos()
	{
		String sPermisos;
		char cPermisos[] = new char[TOTAL_PERMISOS];
		general.inicializarChar(cPermisos);
		
		for (int i = 0; i < ListModel2.getSize(); i++) {
			
			if (  ListModel2.getElementAt(i) == "ALTA_CLIENTES")
			{
				cPermisos[ALTA_CLIENTES] = '1';
			}
			if (  ListModel2.getElementAt(i) == "ALTA_PRODUCTOS")
			{
				cPermisos[ALTA_PRODUCTOS] = '1';
			}
			if (  ListModel2.getElementAt(i) == "ALTA_REACTIVOS")
			{
				cPermisos[ALTA_REACTIVOS] = '1';
			}
			if (  ListModel2.getElementAt(i) == "ALTA_EMPLEADOS")
			{
				cPermisos[ALTA_EMPLEADOS] = '1';
			}
			if (  ListModel2.getElementAt(i) == "ENTRADA_PROD")
			{
				cPermisos[ENTRADA_PROD] = '1';
			}
			if (  ListModel2.getElementAt(i) == "ENTRADA_REAC")
			{
				cPermisos[ENTRADA_REAC] = '1';
			}
			if (  ListModel2.getElementAt(i) == "SALIDA_REAC")
			{
				cPermisos[SALIDA_REAC] = '1';
			}
			if (  ListModel2.getElementAt(i) == "VENTAS")
			{
				cPermisos[VENTAS] = '1';
			}
		}
		sPermisos = String.valueOf(cPermisos);
		return sPermisos;
		
	}
	public String leerPermisos(String sPermisos)
	{		
		char cPermisos[] = new char[TOTAL_PERMISOS];
		general.inicializarChar(cPermisos);
		
		//for (int i = 0; i < TOTAL_PERMISOS; i++) {
			
			if (  sPermisos.charAt(ALTA_CLIENTES) == '1')
			{
				ListModel2.addElement("ALTA_CLIENTES");
			}
			else
			{
				ListModel1.addElement("ALTA_CLIENTES");
			}
			
			if (  sPermisos.charAt(ALTA_PRODUCTOS) == '1')
			{
				ListModel2.addElement("ALTA_PRODUCTOS");
			}
			else
			{
				ListModel1.addElement("ALTA_PRODUCTOS");
			}
			
			if (  sPermisos.charAt(ALTA_REACTIVOS) == '1')
			{
				ListModel2.addElement("ALTA_REACTIVOS");
			}
			else
			{
				ListModel1.addElement("ALTA_REACTIVOS");
			}
			
			if (  sPermisos.charAt(ALTA_EMPLEADOS) == '1')
			{
				ListModel2.addElement("ALTA_EMPLEADOS");
			}
			else
			{
				ListModel1.addElement("ALTA_EMPLEADOS");
			}
			
			if (  sPermisos.charAt(ENTRADA_PROD) == '1')
			{
				ListModel2.addElement("ENTRADA_PROD");
			}
			else
			{
				ListModel1.addElement("ENTRADA_PROD");
			}
			
			if (  sPermisos.charAt(ENTRADA_REAC) == '1')
			{
				ListModel2.addElement("ENTRADA_REAC");
			}
			else
			{
				ListModel1.addElement("ENTRADA_REAC");
			}
			
			if (  sPermisos.charAt(SALIDA_REAC) == '1')
			{
				ListModel2.addElement("SALIDA_REAC");
			}
			else
			{
				ListModel1.addElement("SALIDA_REAC");
			}
			
			if (  sPermisos.charAt(VENTAS) == '1')
			{
				ListModel2.addElement("VENTAS");
			}
			else
			{
				ListModel1.addElement("VENTAS");
			}			
			
		//}
		sPermisos = String.valueOf(cPermisos);
		return sPermisos;
		
	}
	public boolean guardar()
	{
		boolean bResultado = true;
		
		int iNumEmpleado = general.consultarFolio(comando, cNemonicos.FOLIO_EMPLEADOS, cNemonicos.INCREMENTAR_SECUENCIA);
		String sContraseña = txtClave.getText();
		String sNombre = txtNombre.getText();
		String sApellidoP = txtApellidoP.getText();
		String sApellidoM = txtApellidoM.getText();
		String sPermisos = formarPermisos() ;

		String query;
		query = String.format("select GuardarEmpleado(" + iNumEmpleado + ",'%s','%s','%s','%s','%s')",
				sContraseña,sNombre, sApellidoP, sApellidoM,sPermisos );
	
		cTotal insertar = new cTotal(comando);
		try {
			general.generarTransaccion(comando, "BEGIN");
			insertar.ejecutar(query);
			general.generarTransaccion(comando, "COMMIT");

		} catch (SQLException e) {
			general.consultarFolio(comando, 4, cNemonicos.DECREMENTAR_SECUENCIA);
			general.generarTransaccion(comando, "ROLLBACK");
			general.grabarError("frmEmpleados", "guardar", -1, query, e.getMessage(),"Error al insertar Empleado");
			// TODO Auto-generated catch block
			bResultado = false;
			e.printStackTrace();
		}

		return bResultado;		
	}
	
	public boolean conslutar(int iNumEmpleado)
	{
		boolean bResultado = true;

		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "select contraseña,nombre,apellidop,apellidom,permisos from caempleados  where numempleado = "
					+ iNumEmpleado + ";";

			ResultSet resultado = comando.executeQuery(query);

			// Ejecutamos la consulta SQL
			if (resultado.next()) {
				txtClave.setText(resultado.getString("contraseña"));
				txtNombre.setText(resultado.getString("nombre"));
				txtApellidoP.setText(resultado.getString("apellidop"));
				txtApellidoM.setText(resultado.getString("apellidom"));
				String sPermisos = resultado.getString("permisos");
				limpiarListas();
				leerPermisos(sPermisos);
			}
			else
			{
				bResultado = false;
			}

		} catch (SQLException e) {
			bResultado = false;
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {
				txtClave.requestFocus();
			}
		}
					
			
		return bResultado;		
	}
	public void limpiar()
	{
		txtClave.setText("");
		txtNombre.setText("");
		txtApellidoP.setText("");
		txtApellidoM.setText("");
		limpiarListas();
		llenarLista();
	}
	public void limpiarListas()
	{
		int iMax = ListModel1.getSize();
		int iMax2 = ListModel2.getSize();
		
		for (int i = 0; i < iMax; i++) {
			ListModel1.removeElementAt(0);
		}
		
		for (int i = 0; i < iMax2; i++) {
			ListModel2.removeElementAt(0);
		}
		
	}
}
